bitkeeper revision 1.1159.38.5 (41235bac45keyRYBSLnIxXITxalrzg)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Wed, 18 Aug 2004 13:37:48 +0000 (13:37 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Wed, 18 Aug 2004 13:37:48 +0000 (13:37 +0000)
Add 'live' parameter to migrate.

tools/python/xen/xend/XendClient.py
tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/XendMigrate.py
tools/python/xen/xend/server/SrvDomain.py
tools/python/xen/xm/migrate.py
tools/xfrd/xen_domain.c
tools/xfrd/xen_domain.h
tools/xfrd/xfrd.c

index a5194fa748c1f0f28c6b29558e307bdbe767f43a..5041e06cb744a6dfc3bb015ceb6fbfe2b5415388 100644 (file)
@@ -480,10 +480,11 @@ class Xend:
                              {'op'      : 'save',
                               'file'    : filename })
 
-    def xend_domain_migrate(self, id, dst):
+    def xend_domain_migrate(self, id, dst, live=0):
         return self.xendPost(self.domainurl(id),
-                             {'op'      : 'migrate',
-                              'destination': dst })
+                             {'op'         : 'migrate',
+                              'destination': dst,
+                              'live'       : live })
 
     def xend_domain_pincpu(self, id, cpu):
         return self.xendPost(self.domainurl(id),
index 7dead8f82051ba883d1d14a97cb1b1ff20ab9859..05eb28cbe8be0dbc1bb9feac4693d713120da45c 100644 (file)
@@ -586,7 +586,7 @@ class XendDomain:
         self.refresh_schedule()
         return val
 
-    def domain_migrate(self, id, dst):
+    def domain_migrate(self, id, dst, live):
         """Start domain migration.
 
         @param id: domain id
@@ -597,7 +597,7 @@ class XendDomain:
         print 'domain_migrate>', id, dst
         dominfo = self.domain_lookup(id)
         xmigrate = XendMigrate.instance()
-        val = xmigrate.migrate_begin(dominfo.id, dst)
+        val = xmigrate.migrate_begin(dominfo.id, dst, live=live)
         print 'domain_migrate<', val
         return val
 
index b98e5d87fc1c944172ba6f8e5fc6338c5be4ce95..de207aeb5cfd500a51fbc1f7a96bf08159a05240 100644 (file)
@@ -259,7 +259,7 @@ class XendMigrateInfo(XfrdInfo):
     """Representation of a migrate in-progress and its interaction with xfrd.
     """
 
-    def __init__(self, xid, dom, host, port):
+    def __init__(self, xid, dom, host, port, live):
         XfrdInfo.__init__(self)
         self.xid = xid
         self.state = 'begin'
@@ -268,10 +268,14 @@ class XendMigrateInfo(XfrdInfo):
         self.dst_host = host
         self.dst_port = port
         self.dst_dom = None
+        self.live = live
         self.start = 0
         
     def sxpr(self):
-        sxpr = ['migrate', ['id', self.xid], ['state', self.state] ]
+        sxpr = ['migrate',
+                ['id',    self.xid   ],
+                ['state', self.state ],
+                ['live',  self.live  ] ]
         sxpr_src = ['src', ['host', self.src_host], ['domain', self.src_dom] ]
         sxpr.append(sxpr_src)
         sxpr_dst = ['dst', ['host', self.dst_host] ]
@@ -289,7 +293,8 @@ class XendMigrateInfo(XfrdInfo):
                       self.src_dom,
                       vmconfig,
                       self.dst_host,
-                      self.dst_port])
+                      self.dst_port,
+                      self.live ])
         
     def xfr_migrate_ok(self, xfrd, val):
         dom = int(sxp.child0(val))
@@ -410,7 +415,7 @@ class XendMigrate:
         reactor.connectTCP('localhost', XFRD_PORT, xcf)
         return info
     
-    def migrate_begin(self, dom, host, port=XFRD_PORT):
+    def migrate_begin(self, dom, host, port=XFRD_PORT, live=0):
         """Begin to migrate a domain to another host.
 
         @param dom:  domain
@@ -421,7 +426,7 @@ class XendMigrate:
         # Check dom for existence, not migrating already.
         # Subscribe to migrate notifications (for updating).
         xid = self.nextid()
-        info = XendMigrateInfo(xid, dom, host, port)
+        info = XendMigrateInfo(xid, dom, host, port, live)
         self.session_begin(info)
         return info.deferred
 
index 50aa355e62d2db29e8985bbf35fc0812c17ef3e4..bdd57524cea03331c062d6f0d4771f82f18e88ce 100644 (file)
@@ -80,7 +80,8 @@ class SrvDomain(SrvDir):
     def op_migrate(self, op, req):
         fn = FormFn(self.xd.domain_migrate,
                     [['dom', 'str'],
-                     ['destination', 'str']])
+                     ['destination', 'str'],
+                     ['live', 'int']])
         deferred = fn(req.args, {'dom': self.dom.id})
         print 'op_migrate>', deferred
         deferred.addCallback(self._op_migrate_cb, req)
@@ -244,4 +245,5 @@ class SrvDomain(SrvDir):
         req.write('<form method="post" action="%s">' % url)
         req.write('<br><input type="submit" name="op" value="migrate">')
         req.write(' To host: <input type="text" name="destination">')
+        req.write('<input type="checkbox" name="live" value="1">Live')
         req.write('</form>')
index dd81aab0dffd61274de71483c3343f0f91b416aa..366fb5f694c9366cc7182b962362ef00da8d8746 100644 (file)
@@ -22,6 +22,10 @@ gopts.opt('help', short='h',
          fn=set_true, default=0,
          use="Print this help.")
 
+gopts.opt('live', short='l',
+          fn=set_true, default=0,
+          use="Use live migration.")
+
 def help(argv):
     gopts.argv = argv
     gopts.usage()
@@ -38,5 +42,5 @@ def main(argv):
     dst = args[1]
     if dom in [DOM0_NAME, DOM0_ID]:
         opts.err('Cannot migrate ' + dom)
-    server.xend_domain_migrate(dom, dst)
+    server.xend_domain_migrate(dom, dst, opts.vals.live)
         
index 2f6d0fa8f2be3c78934812a45036ba89a3b780a9..5f4dcda5067167a21897bbbac80c6fe724c14819 100644 (file)
@@ -53,7 +53,10 @@ void xcfini(void){
  * At some point during this the domain is suspended, and then there's no way back.
  * Even if something later goes wrong we can't restart the domain.
  */
-int xen_domain_snd(Conn *xend, IOStream *io, uint32_t dom, char *vmconfig, int vmconfig_n){
+int xen_domain_snd(Conn *xend, IOStream *io,
+                   uint32_t dom,
+                   char *vmconfig, int vmconfig_n,
+                   int live){
     int err = 0;
 #ifdef _XEN_XFR_STUB_
     char buf[1024];
@@ -89,7 +92,9 @@ int xen_domain_snd(Conn *xend, IOStream *io, uint32_t dom, char *vmconfig, int v
     ioctxt->suspend = domain_suspend;
     ioctxt->vmconfig = vmconfig;
     ioctxt->vmconfig_n = vmconfig_n;
-
+    if(live){
+        ioctxt->flags |= XCFLAGS_LIVE;
+    }
     err = xc_linux_save(xcinit(), ioctxt);
 #endif   
     dprintf("< err=%d\n", err);
index 4b2e1c7e048a5f665a2742367fb6b445a9856008..2b59f502ee87435756585071311b58d176e9e27e 100644 (file)
@@ -7,7 +7,10 @@
 /** Define to use stubs. Undefine to use Xen ops. */
 //#define _XEN_XFR_STUB_
 
-extern int xen_domain_snd(Conn *xend, IOStream *io, uint32_t dom, char *vmconfig, int vmconfig_n);
+extern int xen_domain_snd(Conn *xend, IOStream *io,
+                          uint32_t dom,
+                          char *vmconfig, int vmconfig_n,
+                          int live);
 extern int xen_domain_rcv(IOStream *io, uint32_t *dom, char **vmconfig, int *vmconfig_n);
 
 
index 5f3b4752bf110aa42f6a492d2dbe2933541e5e6e..87fbac7bb5e184cddb087e0fc41d691d654270ea 100644 (file)
@@ -81,7 +81,7 @@ receiver:
         (xfr.hello <major> <minor>)
         (xfr.err <code> <reason>)
 
-        xend->xfrd (xfr.migrate  <domain> <vmconfig> <host> <port>)
+        xend->xfrd (xfr.migrate  <domain> <vmconfig> <host> <port> <live>)
                    (xfr.save <domain> <vmconfig> <file>)
         xfrd->xend (xfr.suspend <domain>)
         xfrd->xend (xfr.progress <percent> <rate: kb/s>)
@@ -95,7 +95,7 @@ receiver:
 Sxpr oxfr_configure; // (xfr.configure <vmid> <vmconfig>)
 Sxpr oxfr_err;       // (xfr.err <code>)
 Sxpr oxfr_hello;     // (xfr.hello <major> <minor>)
-Sxpr oxfr_migrate;   // (xfr.migrate <vmid> <vmconfig> <host> <port>)
+Sxpr oxfr_migrate;   // (xfr.migrate <vmid> <vmconfig> <host> <port> <live>)
 Sxpr oxfr_migrate_ok;// (xfr.migrate.ok <value>)
 Sxpr oxfr_progress;  // (xfr.progress <percent> <rate: kb/s>)
 Sxpr oxfr_save;      // (xfr.save <vmid> <vmconfig> <file>)
@@ -235,6 +235,7 @@ typedef struct XfrState {
     unsigned long xfr_port;
     char *xfr_host;
     uint32_t vmid_new;
+    int live;
 } XfrState;
 
 /** Get the name of a transfer state.
@@ -607,7 +608,9 @@ int xfr_send_state(XfrState *state, Conn *xend, Conn *peer){
     if(err) goto exit;
     dprintf(">*** Sending domain %u\n", state->vmid);
     err = xen_domain_snd(xend, peer->out,
-                         state->vmid, state->vmconfig, state->vmconfig_n);
+                         state->vmid,
+                         state->vmconfig, state->vmconfig_n,
+                         state->live);
     dprintf(">*** Sent domain %u\n", state->vmid);
     if(err) goto exit;
     // Sending the domain suspends it, and there's no way back.
@@ -752,7 +755,10 @@ int xfr_save(Args *args, XfrState *state, Conn *xend, char *file){
         err = -EINVAL;
         goto exit;
     }
-    err = xen_domain_snd(xend, io, state->vmid, state->vmconfig, state->vmconfig_n);
+    err = xen_domain_snd(xend, io,
+                         state->vmid,
+                         state->vmconfig, state->vmconfig_n,
+                         0);
     if(err){
         err = xfr_error(xend, err);
     } else {
@@ -852,6 +858,8 @@ int xfrd_service(Args *args, int peersock, struct sockaddr_in peer_in){
         if(err) goto exit;
         err = portof(sxpr_childN(sxpr, n++, ONONE), &port);
         if(err) goto exit;
+        err = intof(sxpr_childN(sxpr, n++, ONONE), &state->live);
+        if(err) goto exit;
         err = xfr_send(args, state, conn, addr, port);
 
     } else if(sxpr_elementp(sxpr, oxfr_save)){